﻿#define _CRT_SECURE_NO_WARNINGS 1
//合并果子
//在一个果园里，达达已经将所有的果子打了下来，而且按果子的不同种类分成了不同的堆。
//
//达达决定把所有的果子合成一堆。
//
//每一次合并，达达可以把两堆果子合并到一起，消耗的体力等于两堆果子的重量之和。
//
//可以看出，所有的果子经过 n−1 次合并之后，就只剩下一堆了。
//
//达达在合并果子时总共消耗的体力等于每次合并所耗体力之和。
//
//因为还要花大力气把这些果子搬回家，所以达达在合并果子时要尽可能地节省体力。
//
//假定每个果子重量都为 1，并且已知果子的种类数和每种果子的数目，你的任务是设计出合并的次序方案，使达达耗费的体力最少，并输出这个最小的体力耗费值。
//
//例如有 3 种果子，数目依次为 1，2，9。
//
//可以先将 1、2 堆合并，新堆数目为 3，耗费体力为 3。
//
//接着，将新堆与原先的第三堆合并，又得到新的堆，数目为 12，耗费体力为 12。
//
//所以达达总共耗费体力 = 3 + 12 = 15。
//
//可以证明 15 为最小的体力耗费值。
//
//输入格式
//输入包括两行，第一行是一个整数 n，表示果子的种类数。
//
//第二行包含 n 个整数，用空格分隔，第 i 个整数 ai 是第 i 种果子的数目。
//
//输出格式
//输出包括一行，这一行只包含一个整数，也就是最小的体力耗费值。
//
//输入数据保证这个值小于 231。
//
//数据范围
//1≤n≤10000,
//1≤ai≤20000
//输入样例：
//3
//1 2 9
//输出样例：
//15

//小根堆，即父亲≤儿子，儿子≥父亲
#include <iostream>

using namespace std;

const int N = 10010;
int n;
int h[N], idx; //构成一个堆，h[i]表示编号为i的节点的值（题目中是第i堆果子的个数），idx表示目前的最大编号
int res;

void up(int x) //上浮，调整元素位置
{
    if (x == 1) return; //表示h[x]为堆顶元素，无法再上浮，直接退出

    int y = x / 2; //选中父亲
    if (h[y] > h[x]) //如果父亲的值>儿子，小根堆不成立
    {
        swap(h[x], h[y]); //交换父亲与儿子
        up(y); //现在的y是儿子，继续上浮
    }
}

void down(int x) //下沉，调整元素位置
{
    int y = x * 2; //先选中左儿子
    if (x * 2 + 1 <= idx && h[x * 2] > h[x * 2 + 1]) y = x * 2 + 1;
    //如果右儿子存在 且 右儿子值更小，选中右儿子，原因见文末补充

    if (y <= idx && h[y] < h[x]) //如果选中的儿子存在 且 儿子的值<父亲，小根堆不成立
    {
        swap(h[x], h[y]); //交换父亲与儿子
        down(y); //现在的y是父亲，继续下沉
    }
}

void change() //删除堆顶元素
{
    h[1] = h[idx--];
    down(1);

    //为了删除堆顶，先把堆顶位置让给堆底元素，然后再调整位置。
}

int main()
{
    scanf("%d", &n);

    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &h[i]);
        up(++idx);
        //++ idx为h[i]的编号，此时是编号中最大的，所以在堆底，要上浮
    }

    for (int i = 1; i < n; i++)
    {
        res += h[1]; //消耗体力值加上堆顶元素，即第一堆最少果子消耗的体力
        int tmp = h[1]; //取出第一堆果子

        change(); //删除堆顶元素，表示第一堆果子已经拿出

        res += h[1]; //消耗体力值加上堆顶元素，即第二堆最少果子消耗的体力
        tmp += h[1]; //去除第二堆果子，与第一堆合并

        change(); //删除堆顶元素，表示第二堆果子已经拿出

        h[++idx] = tmp; //插入新果子堆
        up(idx); //idx为新果子堆的编号，此时是编号中最大的，所以在堆底，要上浮
    }

    printf("%d\n", res);

    return 0;
}